package com.qfx.modules.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.swagger.annotations.Api;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
//@EnableOpenApi // 开启 Swagger3,可不写,访问地址：http://ip:port/projectName/swagger-ui/index.html
public class SwaggerConfig {
	@Bean
	public Docket createRestApi() {
		return new Docket(DocumentationType.OAS_30)
				.apiInfo(apiInfo())
				.select()	// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))			//仅扫描类上有@Api注解的
//				.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))	//仅扫描类上有@ApiOperation注解的
//              .apis(RequestHandlerSelectors.basePackage("com.qfx.controller")) 		//只扫描该包下面的接口
                .paths(PathSelectors.any())												//任何请求都扫描
//              .paths(PathSelectors.regex("/test/.*"))									//匹配/test/开头的路径信息
				.build();
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("Swagger3接口文档")						// 标题
				.description("适用于前后端分离统一的接口文档")		// 描述
				.contact(new Contact("作者名称", "网址", "邮箱"))	// 其他信息
				.version("1.0")								// 版本
				.build();
	}
	
//	Swagger3.0常用注解
//		@Api：用在请求的类上，描述Controller的作用
//		  tags=“说明该类的作用，可以在UI界面上看到的注解”
//		  value=“该参数没什么意义，在UI界面上也看到，所以不需要配置”
//	
//		@ApiOperation：用在请求的方法上，说明方法的用途、作用
//		  value=“说明方法的用途、作用”
//		  notes=“方法的备注说明”
	
//		@ApiParam：单个参数描述
//	
//		@ApiImplicitParams：用在请求的方法上，表示一组参数说明
//		  @ApiImplicitParam：用在@ApiImplicitParams注解中，指定一个请求参数的各个方面
//		    name：参数名
//		    value：参数的汉字说明、解释
//		    required：参数是否必须传
//		    paramType：参数放在哪个地方
//		    · header --> 请求参数的获取：@RequestHeader
//		    · query --> 请求参数的获取：@RequestParam
//		    · path（用于restful接口）–> 请求参数的获取：@PathVariable
//		     · div（不常用）
//		    · form（不常用）
//		    dataType：参数类型，默认String，其它值dataType=“Integer”
//		    defaultValue：参数的默认值
//	
//		@ApiResponses：用在请求的方法上，表示一组响应
//		  @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息
//		    code：数字，例如400
//		    message：信息，例如"请求参数没填好"
//		    response：抛出异常的类
//	
//		@ApiModel：用在返回对象类上，表示一个返回响应数据的信息（这种一般用在post创建的时候，使用@RequestBody这样的场景，
//		请求参数无法使用@ApiImplicitParam注解进行描述的时候）
//	
//		@ApiIgnore：使用该注解忽略这个API
//	
//		@ApiModelProperty：用在属性上，描述响应类的属性
}
